home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Visual Basic Source Code
/
Visual Basic Source Code.iso
/
vbsource
/
optivc32
/
vdemow2.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1999-03-06
|
11KB
|
261 lines
/***************************** VDEMOW2.CPP *****************************
* *
* Demo program for *
* V e c t o r L i b *
* for Borland C++ for Windows *
* with OWL 2.0 or 5.0 (shipped with Borland C++ versions 4.x, 5.x) *
* *
* Copyright 1996-1999 by Martin Sander *
* *
* *
* This sample program is meant to demonstrate how to use *
* VectorLib within your Windows programs. It is not intended *
* to demonstrate best Windows programming. *
* *
**************************************************************************/
/*
1. Open the new-project menu with Project/New.
2. Call the project VDEMOW2.
3.a) 32-bit: Choose Application[EXE] for Win32 GUI, static linking,
single-thread.
3.b) 16-bit: Choose Application[EXE] for Windows3.x, memory model LARGE.
4. Be sure, CheckBox for the inclusion of OWL is checked.
5. Hit OK.
6. In the Project window that will now be on the screen, delete the
nodes VDEMOW2.DEF and VDEMOW2.RC.
7.a) 32-bit: Add the node VCF3W.LIB.
7.b) 16-bit: Add the node VCL3W.LIB.
8. In Options/Project, be sure the include-file search path and the
library search path both include the respective OPTIVEC directories,
e.g.: \bc\optivec\include and bc\optivec\lib, resprectively
9. Compile and run.
*/
#include <owl\owlpch.h>
#include <owl\applicat.h>
#include <owl\framewin.h>
#include <VFstd.h>
#include <VCFstd.h>
#include <VFmath.h>
#include <VCFmath.h>
#include <VIstd.h>
#include <Vgraph.h>
#include <math.h>
#if __BORLANDC__ < 0x500
#define BCBOOL BOOL
#else
#define BCBOOL bool
#endif
NEWMATHERR
class TVecWindow : public TWindow
{
public:
fVector X1, X2, Y1, Y2, Y3, Y4, Spc, Freq, Win;
cfVector CX1, CX2;
iVector I1;
ui vsize, spcsize;
int vview;
struct time tStart, tStop;
TVecWindow(TWindow *parent = 0);
~TVecWindow()
{ V_nfree( 12, I1, X1, X2, Y1, Y2, Y3, Y4, CX1, CX2, Spc, Freq, Win ); }
void StartTime( void );
double StopTime( void );
void EvRButtonDown(UINT, TPoint&);
void Paint(TDC&, BCBOOL, TRect&);
DECLARE_RESPONSE_TABLE(TVecWindow);
};
DEFINE_RESPONSE_TABLE1(TVecWindow, TWindow)
EV_WM_RBUTTONDOWN,
END_RESPONSE_TABLE;
TVecWindow::TVecWindow(TWindow *parent)
{
Init(parent, 0, 0);
vsize = 1025;
spcsize = 128;
vview = 0;
V_setErrorEventFile( "VDEMO.LOG", 1 ); // save all VectorLib error messages
I1 = VI_vector( vsize );
X1 = VF_vector( vsize );
X2 = VF_vector( vsize );
Y1 = VF_vector( vsize );
Y2 = VF_vector( vsize );
Y3 = VF_vector( vsize );
Y4 = VF_vector( vsize );
Spc= VF_vector( spcsize+1 );
Freq=VF_vector( spcsize+1 );
Win= VF_vector( 2*spcsize );
CX1 = VCF_vector( vsize );
CX2 = VCF_vector( vsize );
}
void TVecWindow::EvRButtonDown(UINT, TPoint&)
{
switch( vview )
{
default: vview=-1;
case 0: VF_ramp( X1, vsize, 0, 80*M_PI/vsize );
VF_ramp( Freq, spcsize+1, 0, (vsize / (80*M_PI)) / spcsize );
/* get a time axis from 0 to 80 Pi and a corresponding
frequency axis from 0 to the Nyquist frequency */
VF_sin( Y1, X1, vsize );
// get a simple sine wave
break;
case 1: VF_cmp_gtC( Y2, Y1, vsize, 0.7 );
// transform the sine into an asymmetric square wave
break;
case 2: VF_Hanning( Win, 2*spcsize );
Spc[spcsize] = VFs_spectrum( Spc, spcsize, Y2, vsize, Win );
// analyse the frequency spectrum of the square wave
break;
case 3: VI_ramp( I1, vsize, 0, 1 );
VF_ramp( X1, vsize, 0, 4.0 /(vsize-1) );
VF_sinrpi2( Y1, I1, vsize, (vsize-1)/2);
VFx_equV( Y1, Y1, vsize, 10.0, 20.0 );
// get a sine wave, magnify it by a factor of 10
// and displace it vertically by +20 units.
VF_tanrpi2( Y2, I1, vsize, (vsize-1)/2);
VF_limit( Y2, Y2, vsize, -40, 40 );
// limit the range of tangent values
VF_cosecrpi2( Y3, I1, vsize, (vsize-1)/2);
VF_limit( Y3, Y3, vsize, -40, 40 );
// the same for cosecant values
VF_subC( Y3, Y3, vsize, 20.0 );
// displace the cosecant by -20 units.
break;
case 4: VCF_ramp( CX1, vsize, fcplx( M_PI, 0),
fcplx(0.4, 0.008) );
VCF_cos( CX2, CX1, vsize );
VCF_sin( CX1, CX1, vsize );
// Try also with other complex functions!
break;
case 5: break;
}
vview++;
Invalidate();
}
void TVecWindow::Paint(TDC& DC, BCBOOL, TRect&)
{
char dum[100];
unsigned i, j;
float xt, A=1.2, B=-0.13, C=0.85;
V_initPlot( HWindow, DC ); // HWindow is the handle to the current Window
switch( vview )
{
default: break;
case 0: TextOut( DC, 10, 10,
"This is a series of graphs illustrating VectorLib functions.", 60 );
TextOut( DC, 10, 40,
"Always press the right mouse button to see the next view!", 56 );
TextOut( DC, 10, 70,
"Press [Alt] [F4] to end the demonstration.", 41 );
break;
case 1: TextOut( DC, 0, 10, "Sine wave", 9 );
V_drawAxes( VF_min( X1, vsize/2 ), VF_max( X1, vsize/2 ),
-1.0, +1.0 );
VF_xyDataPlot( X1, Y1, vsize/2, PS_SOLID, LIGHTRED );
// show only half of all waves
break;
case 2: TextOut( DC, 0, 10, "Asymmetric", 10 );
TextOut( DC, 0, 30, "square wave", 11 );
V_drawAxes( 0, vsize, -0.3, 1.2 );
VF_yDataPlot( Y2, vsize, PS_SOLID, BLUE );
break;
case 3: TextOut( DC, 0, 10, "Frequency spectrum", 18 );
TextOut( DC, 0, 30, "of the square wave", 18 );
TextOut( DC, 0, 150, "Don't be sur-", 13 );
TextOut( DC, 0, 170, "prised; the next", 16 );
TextOut( DC, 0, 190, "example will show", 17 );
TextOut( DC, 0, 210, "a bit of error", 14 );
TextOut( DC, 0, 230, "handling!", 9 );
VF_xyAutoPlot( Freq, Spc, spcsize+1, PS_SOLID | SY_CROSS, GREEN );
break;
case 4: TextOut( DC, 0, 10, "Trigonometric", 13 );
TextOut( DC,10, 30, "functions:", 10 );
TextOut( DC, 0, 50, "Red: sine", 11 );
TextOut( DC, 0, 70, "Green: tangent", 14 );
TextOut( DC, 0, 90, "Blue: cosecant", 15 );
TextOut( DC, 0, 120, "(sine:", 6 );
TextOut( DC, 0, 140, " *10 and +20,", 15 );
TextOut( DC, 0, 160, " cosecant: -20)", 15 );
VF_xy2AutoPlot( X1, Y2, vsize, PS_SOLID, LIGHTGREEN,
X1, Y3, vsize, PS_SOLID, LIGHTBLUE );
VF_xyDataPlot( X1, Y1, vsize, PS_SOLID, LIGHTRED );
break;
case 5: TextOut( DC, 0, 10, "Playing with functions", 22 );
TextOut( DC, 0, 30, "in the complex plane:", 21 );
TextOut( DC, 0, 60, "Red: complex sine", 19 );
TextOut( DC, 0, 80, "Green: complex cos